/**
 * 防Windows窗口控件
 * @author Ly
 * @version 1.0a
 */
/**
 * Ly.Window的構造函數
 * @param {Object} config Window窗口配置信息
 * @return {Object} 窗口句柄
 * config = {
     container : document.body,                         // 承載窗口的對象
     icon : ''                                          // 圖標
     top : '50%',                                       // 距上，支持像素與百分比,默認-1(或50%),即垂直居中
     left : '50%',                                      // 距左，支持像素與百分比,默認-1(或50%),即水平居中
     width : 300,                                       // 寬度，單位像素
     height : 200,                                      // 高度，單位像素
     themes : 'default',                                // 主題，默認default
     resizable : true,                                  // 是否允許調整大小，默認true
     draggable : true,                                  // 是否允許拖動，默認true
     minable : true,                                    // 是否顯示最小化按鈕，默認true
     maxable : true,                                    // 是否顯示最大化按鈕，默認true
     closeable : true,                                  // 是否顯示關閉按鈕，默認true
     toolsable : true,                                  // 是否顯示按鈕倏，默認true
     buttons : [{
            name : Ly.Event.OK,
            cls : 'btn',
            fn : function() {
            }
        }, {
            name : Ly.Event.CANCLE,
            cls : 'btn',
            fn : function() {
            }
        }],                                             // 按鈕倏中的按鈕，默認OK/CANCEL
     title : 'new window',                              // 標題
     content : 'dddd',                                  // 內容
     disableHandle : true                               // 是否禁止除窗口外的其他操作,默认true
  }
 */
Ly.Window = function(config) {
    var _this = this;
    this.handle = {
        background : null,                                 // 用于遮挡屏幕的对象
        container  : null,                                 // 窗口容器
        shadow     : null,                                 // 阴影
        win        : null,                                 // 窗口
        titleBar   : null,                                 // 标题栏
        workArea   : null,                                 // 内容区域
        buttonsBar : null,                                 // 按钮条
        closeBtn   : null,                                 // 關閉按鈕
        buttons    : []                                    // 按鈕集合
    };
    this.config = {
        container     : config.container || document.body,
        icon          : config.icon || Ly.getPath() + 'images/' + (config.themes || 'default') + '/window/icon.gif',
        closeicon     : Ly.getPath() + 'images/' + (config.themes || 'default') + '/window/close.gif',
        width         : config.width || 300,
        height        : config.height || 200,
        top           : config.top || -1,
        left          : config.left || -1,
        themes        : config.themes || 'default',
		closeIsHide   : typeof config.closeIsHide == 'undefined' ? false : config.closeIsHide,
        resizable     : typeof config.resizable == 'undefined' ? true : config.resizable,
        draggable     : typeof config.draggable == 'undefined' ? true : config.draggable,
        minable       : typeof config.minable == 'undefined' ? true : config.minable,
        maxable       : typeof config.maxable == 'undefined' ? true : config.maxable,
        closeable     : typeof config.closeable == 'undefined' ? true : config.closeable,
        toolsable     : typeof config.toolsable == 'undefined' ? true : config.toolsable,
        buttons       : config.buttons || [{
                name : Ly.Event.OK,
                cls  : '',
                fn   : function() {
                }
            }, {
                name : Ly.Event.CANCEL,
                cls  : '',
                fn   : function() {
                }
            }],
        title         : config.title || 'new Window',
        content       : config.content || '',
        disableHandle : typeof config.disableHandle == 'undefined' ? true : config.disableHandle
    };
	
    this.private = {
        // 創建窗口
        createWin : function() {
            var p,
            	h = _this.handle;
            	c = _this.config;
				st = parseInt(c.container.scrollTop),
				sl = parseInt(c.container.scrollLeft),
            	l = function() {
                	if (c.left == -1) {
						var scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft;
                	    return (c.container.offsetWidth - c.width + sl) / 2 + scrollLeft;
                	} else {
                	    return c.left;
                	}
            	}(),
            	t = function() {
                	if (c.top == -1) {
						var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
                	    return (c.container.offsetHeight - c.height + st) / 2 + scrollTop;
                	} else {
                	    return c.top;
                	}
            	}();
            
            h.background = Ly.createElement('div', {
				cls : 'ly-window-background',
				style : 'display: none; width:' + c.container.offsetWidth + 'px; height:' + c.container.offsetHeight + 'px;'
			});
            h.container = Ly.createElement('div', {
                width  : c.width,
                height : c.height,
                cls    : 'ly-window-container',
                style  : 'display: none;' +
						'width: ' + c.width + 'px;' +
                        'height: ' + c.height + 'px;' +
                        'left: ' + (l + sl) + 'px;' +
                        'top:' + (t + st) + 'px; z-Index: ' + (999 + Ly.getCount()) + ';'
            });
            h.shadow = Ly.createElement('div', {
                cls   : 'ly-window-shadow',
                style : 'width: ' + (c.width - 5) + 'px;' +
                        'height: ' + (c.height - 5) + 'px;'
            });
            h.win = Ly.createElement('div', {
                cls   : 'ly-window-win',
                style : 'width: ' + (c.width - 5) + 'px;' +
                        'height: ' + (c.height - 5) + 'px;'
            });
            h.titleBar = Ly.createElement('div', {
                cls   : 'ly-window-titlebar',
				style : 'width: ' + (c.width - 5 - 4 - 3) + 'px;'
            });
            // 寬=總寬度-顯示陰影的寬度-補丁寬度
            h.workArea = Ly.createElement('div', {
                cls   : 'ly-window-workarea',
                style : 'width: ' + (c.width - 5 - 4 - 1) + 'px;' +
                        'height: ' + (c.height - 30 - (c.toolsable ? 35 : 0) - 5 - 4 - 1) + 'px;'
            });
            h.buttonsBar = Ly.createElement('div', {
                cls   : 'ly-window-buttonsbar',
                style : 'width: ' + (c.width - 5) + 'px;' +
                        'height: 35px;'

            });
            h.closeBtn = Ly.createElement('div', {
                cls : 'ly-window-closebtn'
            });
			h.container.innerHTML = '<iframe id="ly-shadow-iframe" name="ly-shadow-iframe"' +
					'frameborder="0" ' +
					'style="width: 100%; height: 100%;" src="javascript:void(0);"></iframe>';
            c.container.appendChild(h.background);
            c.container.appendChild(h.container);
            h.container.appendChild(h.shadow);
            h.container.appendChild(h.win);
            h.win.appendChild(h.titleBar);
            h.win.appendChild(h.workArea);
            
            Ly.setHeight(h.background, document.body);
            if (c.toolsable) {
                h.win.appendChild(h.buttonsBar);
                // 生成按鈕
                for (var i = 0; i < c.buttons.length; i++) {
                    var btn = Ly.createElement('input', {
                        type  : 'button',
                        cls   : c.buttons[i].cls,
                        style : 'margin-right: 10px; margin-top: 3px;',
                        value : c.buttons[i].name
                    });
                    h.buttonsBar.appendChild(btn);
                    Ly.addEvent('onclick', c.buttons[i].fn, btn);
                    h.buttons.push(btn);
                }
            }
        },
        // 加載窗口內容
        loadContent : function() {
            var h = _this.handle,
            	c = _this.config;
            h.titleBar.innerHTML = c.title;
            h.workArea.innerHTML = c.content;
            h.titleBar.appendChild(h.closeBtn);
            h.closeBtn.innerHTML = '<img src="' + c.closeicon + '" border="0" />';
        },
        // 初始化窗口事件
        initEvent : function(evt) {
            var h = _this.handle,
            	c = _this.config;
            
			if (c.closeIsHide) {
				Ly.addEvent(Ly.Event.ONCLICK, this.hide, h.closeBtn);
			} else {
				Ly.addEvent(Ly.Event.ONCLICK, this.remove, h.closeBtn);
			}
            
            if (c.draggable) {
                // 給標題欄綁定鼠標事件
                h.titleBar.onmousedown = function(evt) {
                    evt = evt || window.event;
                    var p = h.container,
                    	x = evt.layerX || evt.clientX - Ly.getX(h.win),	// 获取鼠标到边框的距离
                    	y = evt.layerY || evt.clientY - Ly.getY(h.win);
                   
                    if (p.setCapture) {
                        p.setCapture();
                    } else if (window.captureEvents) {
                        window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
                    }
                    
                    h.titleBar.style.cursor = 'move';
                    // 給document綁定鼠標事件
                    document.onmousemove = function(evt) {
                        evt = evt || window.event;
                        var pageX = evt.pageX || evt.clientX,
                        	pageY = evt.pageY || evt.clientY;
                        p.style.left = (parseInt(pageX) - x) + 'px';
                        p.style.top  = (parseInt(pageY) - y) + 'px';
                    };
                    document.onmouseup = function(evt) {
                        if (p.releaseCapture) {
                            p.releaseCapture();
                        } else if (window.captureEvents) {
                            window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
                        }
                        h.titleBar.style.cursor = 'default';
                        document.onmousemove    = null;
                        document.onmouseup      = null;
                    };
                };
            }
        },
        // 隱藏窗口
        hide : function() {
            _this.handle.container.style.display  = 'none';
            _this.handle.background.style.display = 'none';
        },
		// 顯示窗口
		show : function() {
            var c = _this.config,
				h = _this.handle;
			h.container.style.display = 'block';
			
            if (c.disableHandle) {
                Ly.setHeight(h.background, document.documentElement);
                Ly.setWidth(h.background, document.documentElement);
                h.background.style.display = 'block';
            }
            //h.background.style.display = 'block';
		},
        // 刪除窗口
        remove : function() {
            var h = _this.handle;
            var c = _this.config;
            _this.handle.container.style.display = 'none';
            Ly.removeEvent(h.closeBtn);
            h.titleBar.removeChild(h.closeBtn);
            h.win.removeChild(h.titleBar);
            h.win.removeChild(h.workArea);
            if (c.toolsable) {
                // 注銷所有的按鈕
                for (var i = 0; i < h.buttons.length; i++) {
                    Ly.removeEvent(h.buttons[i]);
                    h.buttonsBar.removeChild(h.buttons[i]);
					h.buttons[i] = null;
                }
				h.buttons = [];
                h.win.removeChild(h.buttonsBar);
            }
            h.container.removeChild(h.win);
            h.container.removeChild(h.shadow);
            c.container.removeChild(h.container);
            c.container.removeChild(h.background);
        }
    };
};
Ly.Window.prototype = {
    /**
	 * 渲染控件
	 */
    render : function() {
        var p = this.private;
		
        p.createWin();
        p.loadContent();
        p.initEvent();
		if (!this.config.closeIsHide) {
			this.show();
		}
    },
    /**
     * 设置标题栏内容
     * @param {String} str 标题栏内容
     */
    setTitle : function(str) {
        this.handle.titleBar.innerHTML = str;
    },
    /**
     * 设置内容
     * @param {String} str 要显示的HTML
     */
    setContent : function(str) {
        this.handle.workArea.innerHTML = str;
    },
    /**
     * 获取工作区实际大小
     */
    getWorkAreaSize : function() {
        var wa = this.handle.workArea;
        return {
            width : wa.clientWidth,
            height : wa.clientHeight
        };
    },
    // 最小化窗口
    minimize : function() {
    },
    // 最大化窗口
    maximize : function() {
    },
    // 還原窗口
    restore : function() {
    },
    // 隱藏窗口
    hide : function() {
        this.private.hide();
    },
	// 顯示窗口
	show : function() {
		this.private.show();
	},
    // 刪除窗口
    remove : function() {
        this.private.remove();
    },
	// 返回所有的引用
	getHandler : function() {
		return this.handle;
	}
};